#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <assert.h>
#include <stdarg.h>
#include <errno.h>
#include <share.h>


typedef void (*func_t)(void*);

typedef void (*mod_t)(void* m1, const void* new_key);

typedef int (*cmp_t)(const void* c1, const void* c2);

typedef struct darr
{
	void* data;
	int size;
	int count;
}darr_t;

darr_t* init(int size);

void push_back(darr_t* arr, void* cls);

void push_head(darr_t* arr, void* cls);

void push_pos(darr_t* arr, void* cls, int pos);

void pop_from_head(darr_t* arr, void* key, cmp_t cmp);

void pop_from_back(darr_t* arr, void* key, cmp_t cmp);

void pop_all_key(darr_t* arr, void* key, cmp_t cmp);

void pop_pos_key(darr_t* arr, int pos);

void* find_from_head(darr_t* arr, void* key, cmp_t cmp);

void* find_from_back(darr_t* arr, void* key, cmp_t cmp);

darr_t* find_all_key(darr_t* arr, void* key, cmp_t cmp);

void* find_from_pos(darr_t* arr, int pos);

void mod_from_head(darr_t* arr, void* key, cmp_t cmp, void* new_key, mod_t mod);

void mod_from_back(darr_t* arr, void* key, cmp_t cmp, void* new_key, mod_t mod);

void mod_all_key(darr_t* arr, void* key, cmp_t cmp, void* new_key, mod_t mod);

void mod_from_pos(darr_t* arr, int pos, void* new_key, mod_t mod);

void print(darr_t* arr, func_t func);

int darr_nums(darr_t* arr);

void darr_sort(darr_t* arr, cmp_t cmp, int flag);

void darr_clean(darr_t* arr);

void destory(darr_t** arr);
